package exercicio_grafico;

import javax.swing.JOptionPane;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
/**
 * <b>Trabalho - Segunda parte</b><br>
 * A partir da entrada de um número informado pelo usuário gera-se um gráfico
 * com várias linhas, cada uma sendo representada por uma função.
 * 
 * @author dennisxsf@gmail.com - Dennis Fernandes
 * @version
 * 			<p><b>v0.1 (20/08/2014) - Dennis Fernandes</b><br>
 * 				- Criação da classe GerarGraficos <br>
 *				- Criação do atributo {@link #dataset} <br>
 *				- Criação do construtor {@link #GerarGraficos(int)} <br>
 *				- Criação do método {@link #showGraph()} <br>
 *				- Criação do método {@link #createChart(XYDataset)} <br>
 *				- Criação do método {@link #main(String[])} <br>
 * 			</p>
 */
public class GerarGraficos {
	/**
	 * 
	 */
	private XYSeriesCollection dataset;
	/**
	 * Construtor
	 * 
	 * @param numero_grafico
	 */
	public GerarGraficos(int numero_grafico) {
        dataset = new XYSeriesCollection();
        XYSeries primeira_linha = new XYSeries("N");		// Primeira linha
        XYSeries segunda_linha = new XYSeries("N²");		// Segunda linha
        XYSeries terceira_linha = new XYSeries("N³");		// Terceira linha
        XYSeries quarta_linha = new XYSeries("log N");		// Quarta linha
        XYSeries quinta_linha = new XYSeries("N.log N");	// Quinta linha
        XYSeries sexta_linha = new XYSeries("2^N");			// Sexta linha
        
        for(int i = 0; i <= numero_grafico; i++) {
        	primeira_linha.add(i, i);
        }
        dataset.addSeries(primeira_linha);
        
        for(int i = 0; i <= numero_grafico; i++) {
        	segunda_linha.add(i, Math.pow(i, 2));
        }
        dataset.addSeries(segunda_linha);
        
        for(int i = 0; i <= numero_grafico; i++) {
        	terceira_linha.add(i, Math.pow(i, 3));
        }
        dataset.addSeries(terceira_linha);
        
        for(int i = 1; i <= numero_grafico; i++) {
        	quarta_linha.add(i, Math.log(i));
        }
        dataset.addSeries(quarta_linha);
        
        for(int i = 1; i <= numero_grafico; i++) {
        	quinta_linha.add(i, (i * Math.log(i)) );
        }
        dataset.addSeries(quinta_linha);
        
        for(int i = 1; i <= numero_grafico; i++) {
        	sexta_linha.add(i, (2^i));
        }
        dataset.addSeries(sexta_linha);
        
        showGraph();
    }
	/**
	 * Método interno responsável por gerar o gráfico e aplica-lo ao frame
	 */
	private void showGraph() {
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(1000, 550));
        final ApplicationFrame frame = new ApplicationFrame("Primeiro Gráfico");
        frame.setContentPane(chartPanel);
        frame.pack();
        frame.setVisible(true);
    }
	/**
	 * Método interno responsável pela configuração dos dados no gráfico
	 * 
	 * @param dataset (Dados a serem exibidos no gráfico)
	 * @return chart (Gráfico configurado com dados)
	 */
    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart chart = ChartFactory.createScatterPlot(
            "Gráfico de Linha",       // Título do Gráfico
            "Eixo X",                    // Legenda do Eixo X
            "Eixo Y",                  // Legenda do Eixo Y
            dataset,                  // Dados
            PlotOrientation.VERTICAL, // Orientação
            true,                     // Incluir Legenda
            true,                     // Tooltips
            false                     // urls
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        renderer.setSeriesLinesVisible(0, true);
        plot.setRenderer(renderer);
        return chart;
    }
    /**
     * Método principal
     * 
     * @param args
     */
	public static void main(String[] args) {
		int numero_grafico = Integer.parseInt( JOptionPane.showInputDialog("Informe um número:") );
		new GerarGraficos(numero_grafico);
	}
}
